gtkwidget: Make gtk_widget_event() Accept pointing events in root coordinates
authorCarlos Garnacho <carlosg@gnome.org>
Fri, 31 Mar 2017 16:25:04 +0000 (18:25 +0200)
committerCarlos Garnacho <carlosg@gnome.org>
Thu, 25 May 2017 14:25:58 +0000 (16:25 +0200)
This function will, at the last minute, ensure the event contains the right
widget-relative coordinates for the widget the event is being emitted to.

gtk/gtkwidget.c

index 55e1353224aa8f1b1fd5e2fd0e6749c0b863213f..a550394ca595874c79bfb251a4323dec3af25a65 100644 (file)
@@ -6981,6 +6981,26 @@ event_window_is_still_viewable (GdkEvent *event)
     }
 }
 
+static void
+translate_coordinates (GdkEvent  *event,
+                       GtkWidget *widget)
+{
+  GtkWidget *event_widget;
+  gdouble xd, yd;
+  gint x, y;
+
+  if (!gdk_event_get_coords (event, &xd, &yd))
+    return;
+  event_widget = gtk_get_event_widget (event);
+
+  /* FIXME: loses precision */
+  x = xd;
+  y = yd;
+  gtk_widget_translate_coordinates (event_widget, widget,
+                                    x, y, &x, &y);
+  gdk_event_set_coords (event, x, y);
+}
+
 static gint
 gtk_widget_event_internal (GtkWidget *widget,
                           GdkEvent  *event)
@@ -6996,6 +7016,7 @@ gtk_widget_event_internal (GtkWidget *widget,
     return TRUE;
 
   g_object_ref (widget);
+  translate_coordinates (event_copy, widget);
 
   if (widget == gtk_get_event_widget (event))
     return_val |= _gtk_widget_run_controllers (widget, event, GTK_PHASE_TARGET);